import {createRouter, createWebHashHistory, RouteRecordRaw} from 'vue-router'
import nProgress from 'nprogress'
import {getToken} from "@/utils/auth";

declare module 'vue-router' {
    interface RouteMeta {
        // 每个路由都必须声明
        imgUrl: string
    }
}

/* 加载 model 文件夹下所有 .ts 结尾的文件，但不包括 menuList.ts。options的eager参数表示是否在模块加载时就执行加载模块。*/
const modelModules = import.meta.glob('./model/!(menuList).ts',{ eager: true });
const menuModules = import.meta.glob('./model/menuList.ts',{ eager: true });

const modelRouters : RouteRecordRaw[] = mapModuleRouterList(modelModules)
const menuRouters : RouteRecordRaw[] = mapModuleRouterList(menuModules)

// 当找不到页面时
const constantRoutes = [
    {
        path: '/:catchAll(.*)',
        redirect: '/404'
    }
]

const defaultRoutes = [
    {
        path: '/',
        redirect: '/nav'
    },
    {
        path: '/nav',
        name: '导航页',
        component: () => import('@/view/nav/Nav.vue')
    },
    {
        path: '/index',
        name: '博客',
        component: () => import('@/view/Index.vue'),
        redirect: '/home',
        children: [
            {
                path: '/404',
                name: '404',
                component: () => import('@/view/error/404.vue'),
                meta: { imgUrl: 'https://img.mikufufu.com/image/1.webp' }
            },
            ...menuRouters
        ]
    },
]

/**
 * 所有路由
 */
export const allRoutes = [...constantRoutes, ...defaultRoutes , ...modelRouters];

// 固定路由模块转换为路由
export function mapModuleRouterList(modules: Record<string, unknown>): Array<RouteRecordRaw> {
    const routerList: Array<RouteRecordRaw> = [];
    Object.keys(modules).forEach((key) => {
        // @ts-ignore
        const mod = modules[key].default || {};
        const modList = Array.isArray(mod) ? [...mod] : [mod];
        routerList.push(...modList);
    });
    return routerList;
}

/**
 * 创建路由
 */
const router = createRouter({
    // 路由模式 hash模式带#
    history: createWebHashHistory(),
    //不带#
    // history: createWebHistory(),
    routes: allRoutes,
    scrollBehavior: () => ({
        left: 0,
        top: 0,
        behavior: 'smooth' /* 滚动行为 */
    })
})

// @ts-ignore
router.beforeEach((to, from, next) => {
    // 每次切换页面时，调用进度条
    nProgress.start()
    // 如果要去的页面是登录页
    // if (to.path === '/login') {
    //     next()
    // }
    // 如果要去的页面是聊天页, 判断是否登录,未登录则跳转登录页
    if (to.path === '/chat') {
        if(!getToken()){
            next('/login')
        }
    }
    // 没有 next() 页面不会跳转
    next()
})

router.afterEach(() => {
    nProgress.done()// 在即将进入新的页面组件前，关闭掉进度条
})

console.log('allRoutes', allRoutes)

/**
 * 重置路由。
 * 该函数遍历当前路由器中的所有路由，对于具有名称的路由，如果路由器中仍然存在该路由，则移除它。
 * 注意：该函数不接受参数，也不返回任何值。
 */
export function resetRouter() {
    // 遍历当前路由器中的所有路由
    router.getRoutes().forEach(route => {
        const { name } = route
        // 如果路由具有名称
        if (name) {
            // 如果路由器中仍然存在该路由，则移除它
            router.hasRoute(name) && router.removeRoute(name)
        }
    })
}


export default router
